package com.tong.hao.fw.service.config.swagger;

import com.tong.hao.common.enums.CommonEnum;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @ClassName Swagger2Config
 * @Author 友野浩二
 * @Description Swagger2配置
 * @Version 1.0
 * <pre>
 *      1- Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。
 *          一个规范和完整的框架，用于生成、描述、调用和可视化RESTful风格的Web服务，加上swagger-ui，可以有很好的呈现。
 *          @EnableSwagger2注解启用Swagger2
 *      2- @Configuration用于定义配置类
 *          可替换xml配置文件，被注解的类内部包含有一个或多个被@Bean注解的方法，
 *          这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描，并用于构建bean定义，初始化Spring容器。
 *      3- SpringBoot集成Swagger2遇到异常：请求不到swagger-ui.html的问题
 *          这个错误，是因为静态资源路径映射问题导致。
 *          我们在访问http://localhost/swagger-ui.html时，这个swagger-ui.html相关的所有前端静态文件都在springfox-swagger-ui-2.8.0.jar/META-INF/resources里面。
 *          SpringBoot自动配置本身并不会把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面,所以我们需要手动的将静态资源路径指向这里。
 *          【注】：解决方法参见WebMvcConfig类
 * </pre>
 */
@EnableSwagger2
@Configuration
public class FwSwagger2Config {

    /**
     * 是否开启swagger，正式环境一般是需要关闭的，可根据springboot的多环境配置进行设置
     */
    @Value(value = "${swagger2.enabled}")
    Boolean swaggerEnabled;

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                // 是否开启
                .enable(swaggerEnabled).select()
                // 扫码接口的包路径
                .apis(RequestHandlerSelectors.basePackage(CommonEnum.SWAGGER_FW_PACKAGE.getValue()))
                // 指定路径处理PathSelectors.any()代表所有的路径
                .paths(PathSelectors.any())
                .build()
                .pathMapping("/");
    }

    /**
     * @return springfox.documentation.service.ApiInfo
     * @Author 友野浩二
     * @Description // apiInfo中，主要配置一下Swagger2文档网站的信息
     **/
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("SpringBoot2.x集成Swagger2 Tong Online Fw Service RESTful API")
                .description("流水API描述")
                // 作者信息
                .contact(new Contact("ShiHao", "http://localhost:9110/tong-fw/swagger-ui.html", "15771691708@163.com"))
                // 版本
                .version("1.0")
                .build();
    }
}
